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.
- {audiometa_python-0.9.0/audiometa_python.egg-info → audiometa_python-0.10.0}/PKG-INFO +1 -1
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/cli.py +5 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +23 -1
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_riff_bext_chunk.py +28 -8
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_metadata_setter.py +1 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +2 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +3 -0
- audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator/test_deleting.py +50 -0
- audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator/test_reading.py +37 -0
- audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator/test_writing.py +60 -0
- audiometa_python-0.10.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/unified_metadata_key.py +2 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0/audiometa_python.egg-info}/PKG-INFO +1 -1
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/SOURCES.txt +4 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/pyproject.toml +1 -1
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/LICENSE +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/README.md +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/__main__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/_audio_file.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/exceptions.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_MetadataManager.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_riff_file_structure.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/riff/_riff_info_chunk.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/_constants.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/assets/create_test_files.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/common/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/common/external_tool_runner.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/scripts/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/technical_info_inspector.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/conftest.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_options.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/test_formatting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/conftest.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_options.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album_artists/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/artists/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/bpm/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/comment/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/composer/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/copyright/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/description/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/description/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/description/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/description/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/disc_number/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/language/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/lyrics/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
- {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
- {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
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/reading/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/test_audio_file.py +0 -0
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/__init__.py +0 -0
- {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
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
- {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
- {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
- {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
- {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
- {audiometa_python-0.9.0/audiometa/test/tests/unit/audio_file → audiometa_python-0.10.0/audiometa/test/tests/unit}/__init__.py +0 -0
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
- {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
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/flac_md5_state.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/id3v1_genre_code_map.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/metadata_format.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/metadata_writing_strategy.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/mutagen_exception_handler.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/base.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/config.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/macos.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/rating_profiles.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/tool_path_resolver.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/utils/types.py +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/dependency_links.txt +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/entry_points.txt +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/requires.txt +0 -0
- {audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa_python.egg-info/top_level.txt +0 -0
- {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.
|
|
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
|
|
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
|
|
214
|
-
|
|
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
|
|
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:
|
|
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 =
|
|
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
|
|
237
|
+
# Update existing bext chunk field
|
|
230
238
|
bext_start = pos + 8
|
|
231
|
-
riff_data[bext_start : bext_start +
|
|
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
|
-
|
|
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
|
|
|
@@ -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"
|
audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator/test_deleting.py
ADDED
|
@@ -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)
|
audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator/test_reading.py
ADDED
|
@@ -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)
|
audiometa_python-0.10.0/audiometa/test/tests/integration/metadata_field/originator/test_writing.py
ADDED
|
@@ -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)
|
|
File without changes
|
|
@@ -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.
|
|
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.
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/_rating_supporting/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/id3v1_raw_metadata.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py
RENAMED
|
File without changes
|
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/assets/create_test_files.py
RENAMED
|
File without changes
|
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/common/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/scripts/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/temp_file_with_metadata.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/helpers/vorbis/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/__init__.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_basic.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_formats.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_options.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/read/test_unified.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/test_delete.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/test_formatting.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/test_help.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/__init__.py
RENAMED
|
File without changes
|
{audiometa_python-0.9.0 → audiometa_python-0.10.0}/audiometa/test/tests/e2e/cli/write/test_basic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|