audiometa-python 0.9.0__tar.gz → 0.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. {audiometa_python-0.9.0/audiometa_python.egg-info → audiometa_python-0.10.0}/PKG-INFO +1 -1
  2. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/cli.py +5 -0
  3. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +23 -1
  4. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_riff_bext_chunk.py +28 -8
  5. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_metadata_setter.py +1 -0
  6. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +2 -0
  7. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +3 -0
  8. audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator/test_deleting.py +50 -0
  9. audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator/test_reading.py +37 -0
  10. audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator/test_writing.py +60 -0
  11. audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
  12. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/unified_metadata_key.py +2 -0
  13. {audiometa_python-0.9.0 → audiometa_python-0.10.0/audiometa_python.egg-info}/PKG-INFO +1 -1
  14. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/SOURCES.txt +4 -0
  15. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/pyproject.toml +1 -1
  16. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/LICENSE +0 -0
  17. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/README.md +0 -0
  18. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/__init__.py +0 -0
  19. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/__main__.py +0 -0
  20. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/_audio_file.py +0 -0
  21. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/exceptions.py +0 -0
  22. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_MetadataManager.py +0 -0
  23. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/__init__.py +0 -0
  24. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
  25. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/__init__.py +0 -0
  26. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +0 -0
  27. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
  28. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
  29. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
  30. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
  31. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_riff_file_structure.py +0 -0
  32. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_riff_info_chunk.py +0 -0
  33. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +0 -0
  34. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
  35. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
  36. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
  37. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/__init__.py +0 -0
  38. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/_constants.py +0 -0
  39. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
  40. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
  41. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/__init__.py +0 -0
  42. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/assets/create_test_files.py +0 -0
  43. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/__init__.py +0 -0
  44. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/common/__init__.py +0 -0
  45. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
  46. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/common/external_tool_runner.py +0 -0
  47. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/__init__.py +0 -0
  48. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
  49. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
  50. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
  51. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
  52. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/__init__.py +0 -0
  53. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
  54. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
  55. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
  56. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
  57. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +0 -0
  58. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/__init__.py +0 -0
  59. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
  60. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +0 -0
  61. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
  62. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
  63. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/scripts/__init__.py +0 -0
  64. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/technical_info_inspector.py +0 -0
  65. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
  66. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/__init__.py +0 -0
  67. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
  68. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
  69. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
  70. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +0 -0
  71. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/__init__.py +0 -0
  72. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/conftest.py +0 -0
  73. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/__init__.py +0 -0
  74. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
  75. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
  76. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
  77. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
  78. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
  79. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
  80. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
  81. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
  82. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
  83. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
  84. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
  85. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
  86. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
  87. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
  88. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
  89. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_options.py +0 -0
  90. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
  91. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
  92. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/test_formatting.py +0 -0
  93. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
  94. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
  95. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
  96. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
  97. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
  98. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
  99. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
  100. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
  101. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
  102. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
  103. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
  104. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
  105. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
  106. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
  107. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
  108. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +0 -0
  109. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
  110. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/__init__.py +0 -0
  111. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
  112. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
  113. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
  114. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
  115. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
  116. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
  117. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
  118. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
  119. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
  120. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
  121. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
  122. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
  123. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
  124. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
  125. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
  126. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
  127. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/conftest.py +0 -0
  128. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
  129. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
  130. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +0 -0
  131. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
  132. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
  133. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
  134. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
  135. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
  136. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
  137. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +0 -0
  138. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
  139. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +0 -0
  140. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +0 -0
  141. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
  142. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
  143. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_options.py +0 -0
  144. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
  145. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
  146. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
  147. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/__init__.py +0 -0
  148. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album/__init__.py +0 -0
  149. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
  150. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
  151. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
  152. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album_artists/__init__.py +0 -0
  153. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
  154. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
  155. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
  156. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/artists/__init__.py +0 -0
  157. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
  158. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
  159. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
  160. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/bpm/__init__.py +0 -0
  161. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
  162. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
  163. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
  164. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/comment/__init__.py +0 -0
  165. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
  166. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
  167. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
  168. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/composer/__init__.py +0 -0
  169. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
  170. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
  171. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
  172. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/copyright/__init__.py +0 -0
  173. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
  174. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
  175. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
  176. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/description/__init__.py +0 -0
  177. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/description/test_deleting.py +0 -0
  178. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/description/test_reading.py +0 -0
  179. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/description/test_writing.py +0 -0
  180. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/disc_number/__init__.py +0 -0
  181. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
  182. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
  183. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
  184. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/__init__.py +0 -0
  185. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
  186. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
  187. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
  188. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/__init__.py +0 -0
  189. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/__init__.py +0 -0
  190. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/__init__.py +0 -0
  191. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +0 -0
  192. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +0 -0
  193. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +0 -0
  194. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +0 -0
  195. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
  196. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
  197. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
  198. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +0 -0
  199. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +0 -0
  200. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +0 -0
  201. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +0 -0
  202. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/language/__init__.py +0 -0
  203. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
  204. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
  205. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
  206. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/lyrics/__init__.py +0 -0
  207. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
  208. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
  209. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
  210. {audiometa_python-0.9.0/audiometa/test/tests/integration/metadata_field/publisher → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator}/__init__.py +0 -0
  211. {audiometa_python-0.9.0/audiometa/test/tests/integration/metadata_field/rating → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/publisher}/__init__.py +0 -0
  212. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
  213. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
  214. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
  215. {audiometa_python-0.9.0/audiometa/test/tests/integration/metadata_field/rating/reading → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/rating}/__init__.py +0 -0
  216. {audiometa_python-0.9.0/audiometa/test/tests/integration/metadata_field/rating/writing → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/rating/reading}/__init__.py +0 -0
  217. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +0 -0
  218. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +0 -0
  219. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +0 -0
  220. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
  221. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
  222. {audiometa_python-0.9.0/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/rating/writing}/__init__.py +0 -0
  223. {audiometa_python-0.9.0/audiometa/test/tests/integration/metadata_field/release_date → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format}/__init__.py +0 -0
  224. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +0 -0
  225. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +0 -0
  226. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +0 -0
  227. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
  228. {audiometa_python-0.9.0/audiometa/test/tests/integration/metadata_field/title → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/release_date}/__init__.py +0 -0
  229. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
  230. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
  231. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
  232. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
  233. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
  234. {audiometa_python-0.9.0/audiometa/test/tests/integration/metadata_field/track_number → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/title}/__init__.py +0 -0
  235. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
  236. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
  237. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
  238. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
  239. {audiometa_python-0.9.0/audiometa/test/tests/integration/metadata_field/track_number/reading → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/track_number}/__init__.py +0 -0
  240. {audiometa_python-0.9.0/audiometa/test/tests/integration/real_audio_files → audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/track_number/reading}/__init__.py +0 -0
  241. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +0 -0
  242. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +0 -0
  243. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
  244. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
  245. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
  246. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
  247. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
  248. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
  249. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +0 -0
  250. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +0 -0
  251. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
  252. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
  253. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
  254. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
  255. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
  256. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
  257. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
  258. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
  259. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +0 -0
  260. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +0 -0
  261. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
  262. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
  263. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
  264. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
  265. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/reading/__init__.py +0 -0
  266. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
  267. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
  268. {audiometa_python-0.9.0/audiometa/test/tests/integration/technical_info → audiometa_python-0.10.0/audiometa/test/tests/integration/real_audio_files}/__init__.py +0 -0
  269. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
  270. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
  271. {audiometa_python-0.9.0/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.10.0/audiometa/test/tests/integration/technical_info}/__init__.py +0 -0
  272. {audiometa_python-0.9.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking → audiometa_python-0.10.0/audiometa/test/tests/integration/technical_info/flac_md5}/__init__.py +0 -0
  273. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
  274. {audiometa_python-0.9.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations → audiometa_python-0.10.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/__init__.py +0 -0
  275. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_audio_data_corruption.py +0 -0
  276. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_file.py +0 -0
  277. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_invalid_md5.py +0 -0
  278. {audiometa_python-0.9.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair → audiometa_python-0.10.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations}/__init__.py +0 -0
  279. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_invalid_with_metadata_combinations.py +0 -0
  280. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_state_precedence.py +0 -0
  281. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_unset_with_metadata_combinations.py +0 -0
  282. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_fails_with_id3v1.py +0 -0
  283. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_with_id3v2_only.py +0 -0
  284. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_works_without_id3v1.py +0 -0
  285. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_with_metadata_combinations.py +0 -0
  286. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_unset_md5.py +0 -0
  287. {audiometa_python-0.9.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5 → audiometa_python-0.10.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/__init__.py +0 -0
  288. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_delete_original.py +0 -0
  289. {audiometa_python-0.9.0/audiometa/test/tests/integration/writing → audiometa_python-0.10.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5}/__init__.py +0 -0
  290. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_flipped_md5.py +0 -0
  291. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_partial_md5.py +0 -0
  292. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_random_md5.py +0 -0
  293. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_md5_repair_with_metadata.py +0 -0
  294. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_non_flac_error.py +0 -0
  295. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_unset_md5.py +0 -0
  296. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -0
  297. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
  298. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +0 -0
  299. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
  300. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/test_audio_file.py +0 -0
  301. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +0 -0
  302. {audiometa_python-0.9.0/audiometa/test/tests/integration/writing/writing_strategies → audiometa_python-0.10.0/audiometa/test/tests/integration/writing}/__init__.py +0 -0
  303. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
  304. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
  305. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
  306. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
  307. {audiometa_python-0.9.0/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields → audiometa_python-0.10.0/audiometa/test/tests/integration/writing/writing_strategies}/__init__.py +0 -0
  308. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/__init__.py +0 -0
  309. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_flac_sync.py +0 -0
  310. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_mp3_sync.py +0 -0
  311. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_wav_sync.py +0 -0
  312. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
  313. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
  314. {audiometa_python-0.9.0/audiometa/test/tests/unit → audiometa_python-0.10.0/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields}/__init__.py +0 -0
  315. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +0 -0
  316. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +0 -0
  317. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +0 -0
  318. {audiometa_python-0.9.0/audiometa/test/tests/unit/audio_file → audiometa_python-0.10.0/audiometa/test/tests/unit}/__init__.py +0 -0
  319. {audiometa_python-0.9.0/audiometa/test/tests/unit/audio_file/technical_info → audiometa_python-0.10.0/audiometa/test/tests/unit/audio_file}/__init__.py +0 -0
  320. {audiometa_python-0.9.0/audiometa/test/tests/unit/cli → audiometa_python-0.10.0/audiometa/test/tests/unit/audio_file/technical_info}/__init__.py +0 -0
  321. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
  322. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
  323. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +0 -0
  324. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
  325. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
  326. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
  327. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
  328. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
  329. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
  330. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
  331. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
  332. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
  333. {audiometa_python-0.9.0/audiometa/test/tests/unit/metadata_managers → audiometa_python-0.10.0/audiometa/test/tests/unit/cli}/__init__.py +0 -0
  334. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
  335. {audiometa_python-0.9.0/audiometa/test/tests/unit/metadata_managers/header_info → audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers}/__init__.py +0 -0
  336. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
  337. {audiometa_python-0.9.0/audiometa/test/tests/unit/metadata_managers/metadata_field → audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers/header_info}/__init__.py +0 -0
  338. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
  339. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
  340. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
  341. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
  342. {audiometa_python-0.9.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values → audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers/metadata_field}/__init__.py +0 -0
  343. {audiometa_python-0.9.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading → audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values}/__init__.py +0 -0
  344. {audiometa_python-0.9.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing → audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading}/__init__.py +0 -0
  345. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +0 -0
  346. {audiometa_python-0.9.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating → audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing}/__init__.py +0 -0
  347. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +0 -0
  348. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +0 -0
  349. {audiometa_python-0.9.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading → audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating}/__init__.py +0 -0
  350. {audiometa_python-0.9.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing → audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading}/__init__.py +0 -0
  351. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +0 -0
  352. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +0 -0
  353. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +0 -0
  354. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +0 -0
  355. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +0 -0
  356. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +0 -0
  357. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_date_format_validation.py +0 -0
  358. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_disc_number_validation.py +0 -0
  359. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_format_validation.py +0 -0
  360. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_type_validation.py +0 -0
  361. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_track_number_validation.py +0 -0
  362. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +0 -0
  363. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
  364. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +0 -0
  365. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
  366. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/__init__.py +0 -0
  367. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/flac_md5_state.py +0 -0
  368. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/id3v1_genre_code_map.py +0 -0
  369. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/metadata_format.py +0 -0
  370. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/metadata_writing_strategy.py +0 -0
  371. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/mutagen_exception_handler.py +0 -0
  372. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
  373. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/base.py +0 -0
  374. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/config.py +0 -0
  375. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/macos.py +0 -0
  376. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
  377. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
  378. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/rating_profiles.py +0 -0
  379. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/tool_path_resolver.py +0 -0
  380. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/types.py +0 -0
  381. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/dependency_links.txt +0 -0
  382. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/entry_points.txt +0 -0
  383. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/requires.txt +0 -0
  384. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/top_level.txt +0 -0
  385. {audiometa_python-0.9.0 → audiometa_python-0.10.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: audiometa-python
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: A comprehensive Python library for reading and writing audio metadata across multiple formats
5
5
  Author: AudioMeta Python Contributors
6
6
  Author-email: Andreas Garcia <garcia.andreas.1991@gmail.com>
@@ -94,6 +94,8 @@ def format_as_table(data: dict[str, Any]) -> str:
94
94
  "replaygain",
95
95
  "archival_location",
96
96
  "isrc",
97
+ "description",
98
+ "originator",
97
99
  }
98
100
  if unified_keys.intersection(set(data.keys())):
99
101
  # This is a unified metadata dict, wrap it
@@ -188,6 +190,8 @@ def _write_metadata(args: argparse.Namespace) -> None:
188
190
  metadata[UnifiedMetadataKey.COMMENT] = args.comment
189
191
  if args.description and args.description.strip():
190
192
  metadata[UnifiedMetadataKey.DESCRIPTION] = args.description
193
+ if args.originator and args.originator.strip():
194
+ metadata[UnifiedMetadataKey.ORIGINATOR] = args.originator
191
195
  if args.replaygain and args.replaygain.strip():
192
196
  metadata[UnifiedMetadataKey.REPLAYGAIN] = args.replaygain
193
197
  if args.archival_location and args.archival_location.strip():
@@ -432,6 +436,7 @@ Examples:
432
436
  write_parser.add_argument("--lyrics", help="Unsynchronized lyrics text")
433
437
  write_parser.add_argument("--comment", help="Comment")
434
438
  write_parser.add_argument("--description", help="Description")
439
+ write_parser.add_argument("--originator", help="Originator")
435
440
  write_parser.add_argument("--replaygain", help="ReplayGain information")
436
441
  write_parser.add_argument("--archival-location", help="Archival location")
437
442
  write_parser.add_argument("--isrc", help="International Standard Recording Code (12 characters)")
@@ -15,7 +15,13 @@ from ....utils.rating_profiles import RatingWriteProfile
15
15
  from ....utils.types import RawMetadataDict, RawMetadataKey, UnifiedMetadata, UnifiedMetadataValue
16
16
  from ....utils.unified_metadata_key import UnifiedMetadataKey
17
17
  from .._RatingSupportingMetadataManager import _RatingSupportingMetadataManager
18
- from ._riff_bext_chunk import extract_bext_chunk, find_bext_chunk, find_fmt_chunk, update_bext_description_in_riff_data
18
+ from ._riff_bext_chunk import (
19
+ extract_bext_chunk,
20
+ find_bext_chunk,
21
+ find_fmt_chunk,
22
+ update_bext_description_in_riff_data,
23
+ update_bext_originator_in_riff_data,
24
+ )
19
25
  from ._riff_constants import (
20
26
  RIFF_AUDIO_FORMAT_IEEE_FLOAT,
21
27
  RIFF_FORMAT_CHUNK_MIN_SIZE,
@@ -139,6 +145,7 @@ class _RiffManager(_RatingSupportingMetadataManager):
139
145
  UnifiedMetadataKey.TRACK_NUMBER: self.RiffTagKey.TRACK_NUMBER,
140
146
  UnifiedMetadataKey.ISRC: self.RiffTagKey.ISRC,
141
147
  UnifiedMetadataKey.DESCRIPTION: None,
148
+ UnifiedMetadataKey.ORIGINATOR: None,
142
149
  }
143
150
  metadata_keys_direct_map_write: dict[UnifiedMetadataKey, RawMetadataKey | None] = {
144
151
  UnifiedMetadataKey.TITLE: self.RiffTagKey.TITLE,
@@ -157,6 +164,7 @@ class _RiffManager(_RatingSupportingMetadataManager):
157
164
  UnifiedMetadataKey.TRACK_NUMBER: self.RiffTagKey.TRACK_NUMBER,
158
165
  UnifiedMetadataKey.ISRC: self.RiffTagKey.ISRC,
159
166
  UnifiedMetadataKey.DESCRIPTION: None,
167
+ UnifiedMetadataKey.ORIGINATOR: None,
160
168
  }
161
169
  super().__init__(
162
170
  audio_file=audio_file,
@@ -280,6 +288,17 @@ class _RiffManager(_RatingSupportingMetadataManager):
280
288
  except Exception:
281
289
  pass
282
290
  return None
291
+ if unified_metadata_key == UnifiedMetadataKey.ORIGINATOR:
292
+ # Read from bext chunk
293
+ try:
294
+ self.audio_file.seek(0)
295
+ file_data = self.audio_file.read()
296
+ bext_data = self._extract_bext_chunk(file_data)
297
+ if bext_data and "Originator" in bext_data:
298
+ return cast(str, bext_data["Originator"])
299
+ except Exception:
300
+ pass
301
+ return None
283
302
  msg = f"Metadata key not handled: {unified_metadata_key}"
284
303
  raise MetadataFieldNotSupportedByMetadataFormatError(msg)
285
304
 
@@ -459,6 +478,9 @@ class _RiffManager(_RatingSupportingMetadataManager):
459
478
  if UnifiedMetadataKey.DESCRIPTION in merged_metadata:
460
479
  description_value = merged_metadata[UnifiedMetadataKey.DESCRIPTION]
461
480
  update_bext_description_in_riff_data(riff_data, cast(str | None, description_value))
481
+ if UnifiedMetadataKey.ORIGINATOR in merged_metadata:
482
+ originator_value = merged_metadata[UnifiedMetadataKey.ORIGINATOR]
483
+ update_bext_originator_in_riff_data(riff_data, cast(str | None, originator_value))
462
484
 
463
485
  def _update_riff_chunk_size(self, riff_data: bytearray) -> None:
464
486
  """Update RIFF chunk size in RIFF data.
@@ -210,25 +210,33 @@ def extract_bext_chunk(file_data: bytes, skip_id3v2_tags_func: Callable[[bytes],
210
210
  return None
211
211
 
212
212
 
213
- def update_bext_description_in_riff_data(riff_data: bytearray, value: str | None) -> None:
214
- """Update the Description field in the bext chunk within RIFF data.
213
+ def _update_bext_field_in_riff_data(
214
+ riff_data: bytearray, value: str | None, field_size: int, field_offset: int
215
+ ) -> None:
216
+ """Update a field in the bext chunk within RIFF data.
215
217
 
216
218
  This function modifies the riff_data bytearray in-place to update or create
217
- the bext chunk with the Description field. This is integrated into the main
219
+ the bext chunk with the specified field. This is integrated into the main
218
220
  update flow to avoid multiple file writes.
219
221
 
220
222
  Args:
221
223
  riff_data: RIFF data bytearray (modified in-place)
222
- value: Description value to write, or None/empty string to clear
224
+ value: Field value to write, or None/empty string to clear
225
+ field_size: Size of the field in bytes
226
+ field_offset: Offset of the field within the bext chunk
223
227
  """
224
- encoded = b"\x00" * 256 if value is None or value == "" else value.encode("utf-8")[:255].ljust(256, b"\x00")
228
+ encoded = (
229
+ b"\x00" * field_size
230
+ if value is None or value == ""
231
+ else value.encode("utf-8")[: field_size - 1].ljust(field_size, b"\x00")
232
+ )
225
233
 
226
234
  # Find bext chunk in RIFF data (no ID3v2 tags in riff_data at this point)
227
235
  pos = find_bext_chunk_in_riff_data(riff_data)
228
236
  if pos != -1:
229
- # Update existing bext chunk Description field
237
+ # Update existing bext chunk field
230
238
  bext_start = pos + 8
231
- riff_data[bext_start : bext_start + 256] = encoded
239
+ riff_data[bext_start + field_offset : bext_start + field_offset + field_size] = encoded
232
240
  else:
233
241
  # No bext chunk, create one
234
242
  fmt_pos = find_fmt_chunk_in_riff_data(riff_data)
@@ -237,12 +245,24 @@ def update_bext_description_in_riff_data(riff_data: bytearray, value: str | None
237
245
  fmt_size = int.from_bytes(bytes(riff_data[fmt_pos + 4 : fmt_pos + 8]), "little")
238
246
  insert_pos = fmt_pos + 8 + fmt_size
239
247
  # Create bext chunk data: 602 bytes v1
240
- bext_data = b"bext" + (602).to_bytes(4, "little") + encoded + b"\x00" * 346
248
+ # Fill with zeros, then set the specific field
249
+ bext_data = bytearray(b"bext" + (602).to_bytes(4, "little") + b"\x00" * 602)
250
+ bext_data[8 + field_offset : 8 + field_offset + field_size] = encoded
241
251
  # Insert bext chunk after fmt chunk
242
252
  riff_data[insert_pos:insert_pos] = bext_data
243
253
  # Note: RIFF chunk size will be updated by caller after this method
244
254
 
245
255
 
256
+ def update_bext_description_in_riff_data(riff_data: bytearray, value: str | None) -> None:
257
+ """Update the Description field in the bext chunk within RIFF data."""
258
+ _update_bext_field_in_riff_data(riff_data, value, 256, 0)
259
+
260
+
261
+ def update_bext_originator_in_riff_data(riff_data: bytearray, value: str | None) -> None:
262
+ """Update the Originator field in the bext chunk within RIFF data."""
263
+ _update_bext_field_in_riff_data(riff_data, value, 32, 256)
264
+
265
+
246
266
  def find_bext_chunk_in_riff_data(riff_data: bytearray) -> int:
247
267
  """Find the position of the bext chunk in RIFF data.
248
268
 
@@ -35,6 +35,7 @@ class RIFFMetadataSetter:
35
35
  "copyright": "--ICOP",
36
36
  "isrc": "--ISRC",
37
37
  "description": "--Description",
38
+ "originator": "--Originator",
38
39
  }
39
40
 
40
41
  # Handle list values - include first value in main command to avoid overwriting
@@ -129,6 +129,7 @@ class TestCLIReadComprehensive:
129
129
  "copyright": "© WAV",
130
130
  "comment": "WAV comment",
131
131
  "description": "WAV description",
132
+ "originator": "WAV originator",
132
133
  "isrc": "GBUM71505078",
133
134
  },
134
135
  "wav",
@@ -155,6 +156,7 @@ class TestCLIReadComprehensive:
155
156
  assert unified.get(UnifiedMetadataKey.COPYRIGHT) == "© WAV"
156
157
  assert unified.get(UnifiedMetadataKey.COMMENT) == "WAV comment"
157
158
  assert unified.get(UnifiedMetadataKey.DESCRIPTION) == "WAV description"
159
+ assert unified.get(UnifiedMetadataKey.ORIGINATOR) == "WAV originator"
158
160
  assert unified.get(UnifiedMetadataKey.ISRC) == "GBUM71505078"
159
161
 
160
162
  def test_cli_read_comprehensive_roundtrip(self):
@@ -191,6 +191,8 @@ class TestCLIWriteComprehensive:
191
191
  "WAV comment",
192
192
  "--description",
193
193
  "WAV description",
194
+ "--originator",
195
+ "WAV originator",
194
196
  "--isrc",
195
197
  "GBUM71505078",
196
198
  ],
@@ -213,4 +215,5 @@ class TestCLIWriteComprehensive:
213
215
  assert metadata.get(UnifiedMetadataKey.COPYRIGHT) == "© WAV"
214
216
  assert metadata.get(UnifiedMetadataKey.COMMENT) == "WAV comment"
215
217
  assert metadata.get(UnifiedMetadataKey.DESCRIPTION) == "WAV description"
218
+ assert metadata.get(UnifiedMetadataKey.ORIGINATOR) == "WAV originator"
216
219
  assert metadata.get(UnifiedMetadataKey.ISRC) == "GBUM71505078"
@@ -0,0 +1,50 @@
1
+ import pytest
2
+
3
+ from audiometa import get_unified_metadata_field, update_metadata
4
+ from audiometa.exceptions import MetadataFieldNotSupportedByMetadataFormatError
5
+ from audiometa.test.helpers.riff import RIFFMetadataSetter
6
+ from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
7
+ from audiometa.utils.metadata_format import MetadataFormat
8
+ from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
9
+
10
+
11
+ @pytest.mark.integration
12
+ class TestOriginatorDeleting:
13
+ def test_delete_originator_riff(self):
14
+ with temp_file_with_metadata({}, "wav") as test_file:
15
+ RIFFMetadataSetter.set_metadata(test_file, {"originator": "Test originator"})
16
+ assert get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR) == "Test originator"
17
+
18
+ update_metadata(test_file, {UnifiedMetadataKey.ORIGINATOR: None}, metadata_format=MetadataFormat.RIFF)
19
+ assert get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR) is None
20
+
21
+ def test_delete_originator_preserves_other_fields(self):
22
+ with temp_file_with_metadata({}, "wav") as test_file:
23
+ RIFFMetadataSetter.set_metadata(test_file, {"originator": "Test originator", "title": "Test Title"})
24
+ assert get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR) == "Test originator"
25
+ assert get_unified_metadata_field(test_file, UnifiedMetadataKey.TITLE) == "Test Title"
26
+
27
+ update_metadata(test_file, {UnifiedMetadataKey.ORIGINATOR: None}, metadata_format=MetadataFormat.RIFF)
28
+ assert get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR) is None
29
+ assert get_unified_metadata_field(test_file, UnifiedMetadataKey.TITLE) == "Test Title"
30
+
31
+ def test_delete_originator_vorbis_raises(self):
32
+ with (
33
+ temp_file_with_metadata({}, "flac") as test_file,
34
+ pytest.raises(MetadataFieldNotSupportedByMetadataFormatError),
35
+ ):
36
+ update_metadata(test_file, {UnifiedMetadataKey.ORIGINATOR: None}, metadata_format=MetadataFormat.VORBIS)
37
+
38
+ def test_delete_originator_id3v1_raises(self):
39
+ with (
40
+ temp_file_with_metadata({}, "id3v1") as test_file,
41
+ pytest.raises(MetadataFieldNotSupportedByMetadataFormatError),
42
+ ):
43
+ update_metadata(test_file, {UnifiedMetadataKey.ORIGINATOR: None}, metadata_format=MetadataFormat.ID3V1)
44
+
45
+ def test_delete_originator_id3v2_raises(self):
46
+ with (
47
+ temp_file_with_metadata({}, "mp3") as test_file,
48
+ pytest.raises(MetadataFieldNotSupportedByMetadataFormatError),
49
+ ):
50
+ update_metadata(test_file, {UnifiedMetadataKey.ORIGINATOR: None}, metadata_format=MetadataFormat.ID3V2)
@@ -0,0 +1,37 @@
1
+ import pytest
2
+
3
+ from audiometa import get_unified_metadata_field
4
+ from audiometa.exceptions import MetadataFieldNotSupportedByMetadataFormatError
5
+ from audiometa.test.helpers.riff import RIFFMetadataSetter
6
+ from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
7
+ from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
8
+
9
+
10
+ @pytest.mark.integration
11
+ class TestOriginatorReading:
12
+ def test_riff(self):
13
+ with temp_file_with_metadata({"title": "Test Song"}, "wav") as test_file:
14
+ RIFFMetadataSetter.set_metadata(test_file, {"originator": "Test Originator RIFF"})
15
+ originator = get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR)
16
+ assert originator == "Test Originator RIFF"
17
+
18
+ def test_vorbis(self):
19
+ with (
20
+ temp_file_with_metadata({"title": "Test Song"}, "flac") as test_file,
21
+ pytest.raises(MetadataFieldNotSupportedByMetadataFormatError),
22
+ ):
23
+ get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR)
24
+
25
+ def test_id3v1(self):
26
+ with (
27
+ temp_file_with_metadata({"title": "Test Song"}, "id3v1") as test_file,
28
+ pytest.raises(MetadataFieldNotSupportedByMetadataFormatError),
29
+ ):
30
+ get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR)
31
+
32
+ def test_id3v2(self):
33
+ with (
34
+ temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file,
35
+ pytest.raises(MetadataFieldNotSupportedByMetadataFormatError),
36
+ ):
37
+ get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR)
@@ -0,0 +1,60 @@
1
+ import pytest
2
+
3
+ from audiometa import get_unified_metadata_field, update_metadata
4
+ from audiometa.exceptions import MetadataFieldNotSupportedByMetadataFormatError
5
+ from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
6
+ from audiometa.utils.metadata_format import MetadataFormat
7
+ from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
8
+
9
+
10
+ @pytest.mark.integration
11
+ class TestOriginatorWriting:
12
+ def test_riff(self):
13
+ with temp_file_with_metadata({}, "wav") as test_file:
14
+ test_originator = "Test Originator RIFF"
15
+ test_metadata = {UnifiedMetadataKey.ORIGINATOR: test_originator}
16
+ update_metadata(test_file, test_metadata, metadata_format=MetadataFormat.RIFF)
17
+ originator = get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR)
18
+ assert originator == test_originator
19
+
20
+ def test_riff_empty(self):
21
+ with temp_file_with_metadata({}, "wav") as test_file:
22
+ test_metadata = {UnifiedMetadataKey.ORIGINATOR: ""}
23
+ update_metadata(test_file, test_metadata, metadata_format=MetadataFormat.RIFF)
24
+ originator = get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR)
25
+ assert originator is None
26
+
27
+ def test_riff_long_originator_truncated(self):
28
+ with temp_file_with_metadata({}, "wav") as test_file:
29
+ long_originator = "A" * 50 # Over 32 bytes
30
+ test_metadata = {UnifiedMetadataKey.ORIGINATOR: long_originator}
31
+ update_metadata(test_file, test_metadata, metadata_format=MetadataFormat.RIFF)
32
+ originator = get_unified_metadata_field(test_file, UnifiedMetadataKey.ORIGINATOR)
33
+ assert originator is not None
34
+ assert len(originator.encode("utf-8")) <= 32
35
+
36
+ def test_vorbis_raises(self):
37
+ with temp_file_with_metadata({}, "flac") as test_file:
38
+ test_metadata = {UnifiedMetadataKey.ORIGINATOR: "Test Originator"}
39
+ with pytest.raises(MetadataFieldNotSupportedByMetadataFormatError):
40
+ update_metadata(test_file, test_metadata, metadata_format=MetadataFormat.VORBIS)
41
+
42
+ def test_id3v1_raises(self):
43
+ with temp_file_with_metadata({}, "id3v1") as test_file:
44
+ test_metadata = {UnifiedMetadataKey.ORIGINATOR: "Test Originator"}
45
+ with pytest.raises(MetadataFieldNotSupportedByMetadataFormatError):
46
+ update_metadata(test_file, test_metadata, metadata_format=MetadataFormat.ID3V1)
47
+
48
+ def test_id3v2_raises(self):
49
+ with temp_file_with_metadata({}, "mp3") as test_file:
50
+ test_metadata = {UnifiedMetadataKey.ORIGINATOR: "Test Originator"}
51
+ with pytest.raises(MetadataFieldNotSupportedByMetadataFormatError):
52
+ update_metadata(test_file, test_metadata, metadata_format=MetadataFormat.ID3V2)
53
+
54
+ def test_invalid_type_raises(self):
55
+ from audiometa.exceptions import InvalidMetadataFieldTypeError
56
+
57
+ with temp_file_with_metadata({}, "wav") as test_file:
58
+ bad_metadata = {UnifiedMetadataKey.ORIGINATOR: 12345}
59
+ with pytest.raises(InvalidMetadataFieldTypeError):
60
+ update_metadata(test_file, bad_metadata)
@@ -32,6 +32,7 @@ class UnifiedMetadataKey(str, Enum):
32
32
  ARCHIVAL_LOCATION = "archival_location"
33
33
  ISRC = "isrc"
34
34
  DESCRIPTION = "description"
35
+ ORIGINATOR = "originator"
35
36
 
36
37
  def can_semantically_have_multiple_values(self) -> bool:
37
38
  """Check if the metadata key can semantically have multiple values.
@@ -81,6 +82,7 @@ class UnifiedMetadataKey(str, Enum):
81
82
  UnifiedMetadataKey.ARCHIVAL_LOCATION: str,
82
83
  UnifiedMetadataKey.ISRC: str,
83
84
  UnifiedMetadataKey.DESCRIPTION: str,
85
+ UnifiedMetadataKey.ORIGINATOR: str,
84
86
  }
85
87
  result_type = app_metadata_keys_optional_types_map.get(self)
86
88
  if not result_type:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: audiometa-python
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: A comprehensive Python library for reading and writing audio metadata across multiple formats
5
5
  Author: AudioMeta Python Contributors
6
6
  Author-email: Andreas Garcia <garcia.andreas.1991@gmail.com>
@@ -202,6 +202,10 @@ audiometa/test/tests/integration/metadata_field/lyrics/__init__.py
202
202
  audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py
203
203
  audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py
204
204
  audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py
205
+ audiometa/test/tests/integration/metadata_field/originator/__init__.py
206
+ audiometa/test/tests/integration/metadata_field/originator/test_deleting.py
207
+ audiometa/test/tests/integration/metadata_field/originator/test_reading.py
208
+ audiometa/test/tests/integration/metadata_field/originator/test_writing.py
205
209
  audiometa/test/tests/integration/metadata_field/publisher/__init__.py
206
210
  audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py
207
211
  audiometa/test/tests/integration/metadata_field/publisher/test_reading.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "audiometa-python"
7
- version = "0.9.0"
7
+ version = "0.10.0"
8
8
  description = "A comprehensive Python library for reading and writing audio metadata across multiple formats"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"