audiometa-python 0.8.0__tar.gz → 0.8.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {audiometa_python-0.8.0/audiometa_python.egg-info → audiometa_python-0.8.1}/PKG-INFO +11 -11
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/README.md +10 -10
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/__init__.py +22 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +59 -1
- audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/__init__.py +1 -0
- audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_flac_sync.py +306 -0
- audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_mp3_sync.py +174 -0
- audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_wav_sync.py +306 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1/audiometa_python.egg-info}/PKG-INFO +11 -11
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/SOURCES.txt +4 -2
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/pyproject.toml +1 -1
- audiometa_python-0.8.0/audiometa/test/tests/integration/audio_format/wav/test_wav_with_id3v2_tags.py +0 -83
- audiometa_python-0.8.0/audiometa/test/tests/integration/writing/writing_strategies/test_sync_strategy.py +0 -279
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/LICENSE +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/__main__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/_audio_file.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/cli.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/exceptions.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_MetadataManager.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/_constants.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/assets/create_test_files.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/common/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/common/external_tool_runner.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_setter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/scripts/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/technical_info_inspector.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/conftest.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_options.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_formatting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/conftest.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_options.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_audio_data_corruption.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_file.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_invalid_md5.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_invalid_with_metadata_combinations.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_state_precedence.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_unset_with_metadata_combinations.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_fails_with_id3v1.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_with_id3v2_only.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_works_without_id3v1.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_with_metadata_combinations.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_unset_md5.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_delete_original.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_flipped_md5.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_partial_md5.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_random_md5.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_md5_repair_with_metadata.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_non_flac_error.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_unset_md5.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/test_audio_file.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/cli/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_date_format_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_disc_number_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_format_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_type_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_track_number_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/flac_md5_state.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/id3v1_genre_code_map.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/metadata_format.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/metadata_writing_strategy.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/mutagen_exception_handler.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/base.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/config.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/macos.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/rating_profiles.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/tool_path_resolver.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/types.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/unified_metadata_key.py +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/dependency_links.txt +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/entry_points.txt +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/requires.txt +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/top_level.txt +0 -0
- {audiometa_python-0.8.0 → audiometa_python-0.8.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: audiometa-python
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.1
|
|
4
4
|
Summary: A comprehensive Python library for reading and writing audio metadata across multiple formats
|
|
5
5
|
Author: AudioMeta Python Contributors
|
|
6
6
|
Author-email: Andreas Garcia <garcia.andreas.1991@gmail.com>
|
|
@@ -41,29 +41,29 @@ Requires-Dist: PyYAML==6.0; extra == "yaml"
|
|
|
41
41
|
Dynamic: license-file
|
|
42
42
|
|
|
43
43
|
<div align="center">
|
|
44
|
-
<img src="https://raw.githubusercontent.com/
|
|
44
|
+
<img src="https://raw.githubusercontent.com/BehindTheMusicTree/audiometa/main/assets/logo.png" alt="AudioMeta Logo" width="200"/>
|
|
45
45
|
</div>
|
|
46
46
|
|
|
47
47
|
# AudioMeta Python
|
|
48
48
|
|
|
49
|
-
[](https://github.com/BehindTheMusicTree/audiometa/actions/workflows/ci.yml)
|
|
50
50
|
[](https://www.python.org/)
|
|
51
51
|
[](LICENSE)
|
|
52
52
|
[](https://pypi.org/project/audiometa-python/)
|
|
53
53
|
[](https://pepy.tech/project/audiometa-python)
|
|
54
|
-
[](https://github.com/BehindTheMusicTree/audiometa/stargazers)
|
|
55
55
|
|
|
56
56
|
A powerful, unified Python library for reading and writing audio metadata across multiple formats. AudioMeta supports MP3, FLAC, and WAV audio files, working seamlessly with ID3v1, ID3v2, Vorbis, and RIFF metadata formats through a single, consistent API.
|
|
57
57
|
|
|
58
|
-
**Author**: [Andreas Garcia](https://github.com/
|
|
58
|
+
**Author**: [Andreas Garcia](https://github.com/BehindTheMusicTree)
|
|
59
59
|
|
|
60
60
|
## ⭐ Show Your Support
|
|
61
61
|
|
|
62
62
|
If you find AudioMeta Python useful, please consider:
|
|
63
63
|
|
|
64
64
|
- ⭐ **Starring this repository** - It helps others discover the project
|
|
65
|
-
- 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/
|
|
66
|
-
- 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/
|
|
65
|
+
- 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/BehindTheMusicTree/audiometa/issues)
|
|
66
|
+
- 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions) or [feature requests](https://github.com/BehindTheMusicTree/audiometa/issues)
|
|
67
67
|
- 🤝 **Contributing** - See [CONTRIBUTING.md](CONTRIBUTING.md) for ways to help
|
|
68
68
|
- 📢 **Sharing** - Tell others about AudioMeta Python
|
|
69
69
|
|
|
@@ -111,7 +111,7 @@ Your support helps make this project better for everyone! 🎵
|
|
|
111
111
|
- [📝 Changelog](#-changelog)
|
|
112
112
|
- [🤝 Contributing](#-contributing)
|
|
113
113
|
- [Code of Conduct](CODE_OF_CONDUCT.md)
|
|
114
|
-
- [Security Policy](https://github.com/
|
|
114
|
+
- [Security Policy](https://github.com/BehindTheMusicTree/audiometa/security/policy)
|
|
115
115
|
- [License](#license)
|
|
116
116
|
|
|
117
117
|
## ✨ Features
|
|
@@ -1561,11 +1561,11 @@ Whether you're fixing bugs, adding features, improving documentation, or sharing
|
|
|
1561
1561
|
|
|
1562
1562
|
**Ways to contribute:**
|
|
1563
1563
|
|
|
1564
|
-
- 🐛 **Report bugs** - Use the [bug report template](https://github.com/
|
|
1565
|
-
- 💡 **Suggest features** - Use the [feature request template](https://github.com/
|
|
1564
|
+
- 🐛 **Report bugs** - Use the [bug report template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=bug_report.yml)
|
|
1565
|
+
- 💡 **Suggest features** - Use the [feature request template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=feature_request.yml)
|
|
1566
1566
|
- 🔧 **Submit pull requests** - See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines
|
|
1567
1567
|
- 📝 **Improve documentation** - Fix typos, clarify explanations, add examples
|
|
1568
|
-
- 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/
|
|
1568
|
+
- 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions)
|
|
1569
1569
|
- ⭐ **Star the repo** - Help others discover the project
|
|
1570
1570
|
|
|
1571
1571
|
For detailed contribution guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/
|
|
2
|
+
<img src="https://raw.githubusercontent.com/BehindTheMusicTree/audiometa/main/assets/logo.png" alt="AudioMeta Logo" width="200"/>
|
|
3
3
|
</div>
|
|
4
4
|
|
|
5
5
|
# AudioMeta Python
|
|
6
6
|
|
|
7
|
-
[](https://github.com/BehindTheMusicTree/audiometa/actions/workflows/ci.yml)
|
|
8
8
|
[](https://www.python.org/)
|
|
9
9
|
[](LICENSE)
|
|
10
10
|
[](https://pypi.org/project/audiometa-python/)
|
|
11
11
|
[](https://pepy.tech/project/audiometa-python)
|
|
12
|
-
[](https://github.com/BehindTheMusicTree/audiometa/stargazers)
|
|
13
13
|
|
|
14
14
|
A powerful, unified Python library for reading and writing audio metadata across multiple formats. AudioMeta supports MP3, FLAC, and WAV audio files, working seamlessly with ID3v1, ID3v2, Vorbis, and RIFF metadata formats through a single, consistent API.
|
|
15
15
|
|
|
16
|
-
**Author**: [Andreas Garcia](https://github.com/
|
|
16
|
+
**Author**: [Andreas Garcia](https://github.com/BehindTheMusicTree)
|
|
17
17
|
|
|
18
18
|
## ⭐ Show Your Support
|
|
19
19
|
|
|
20
20
|
If you find AudioMeta Python useful, please consider:
|
|
21
21
|
|
|
22
22
|
- ⭐ **Starring this repository** - It helps others discover the project
|
|
23
|
-
- 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/
|
|
24
|
-
- 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/
|
|
23
|
+
- 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/BehindTheMusicTree/audiometa/issues)
|
|
24
|
+
- 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions) or [feature requests](https://github.com/BehindTheMusicTree/audiometa/issues)
|
|
25
25
|
- 🤝 **Contributing** - See [CONTRIBUTING.md](CONTRIBUTING.md) for ways to help
|
|
26
26
|
- 📢 **Sharing** - Tell others about AudioMeta Python
|
|
27
27
|
|
|
@@ -69,7 +69,7 @@ Your support helps make this project better for everyone! 🎵
|
|
|
69
69
|
- [📝 Changelog](#-changelog)
|
|
70
70
|
- [🤝 Contributing](#-contributing)
|
|
71
71
|
- [Code of Conduct](CODE_OF_CONDUCT.md)
|
|
72
|
-
- [Security Policy](https://github.com/
|
|
72
|
+
- [Security Policy](https://github.com/BehindTheMusicTree/audiometa/security/policy)
|
|
73
73
|
- [License](#license)
|
|
74
74
|
|
|
75
75
|
## ✨ Features
|
|
@@ -1519,11 +1519,11 @@ Whether you're fixing bugs, adding features, improving documentation, or sharing
|
|
|
1519
1519
|
|
|
1520
1520
|
**Ways to contribute:**
|
|
1521
1521
|
|
|
1522
|
-
- 🐛 **Report bugs** - Use the [bug report template](https://github.com/
|
|
1523
|
-
- 💡 **Suggest features** - Use the [feature request template](https://github.com/
|
|
1522
|
+
- 🐛 **Report bugs** - Use the [bug report template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=bug_report.yml)
|
|
1523
|
+
- 💡 **Suggest features** - Use the [feature request template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=feature_request.yml)
|
|
1524
1524
|
- 🔧 **Submit pull requests** - See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines
|
|
1525
1525
|
- 📝 **Improve documentation** - Fix typos, clarify explanations, add examples
|
|
1526
|
-
- 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/
|
|
1526
|
+
- 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions)
|
|
1527
1527
|
- ⭐ **Star the repo** - Help others discover the project
|
|
1528
1528
|
|
|
1529
1529
|
For detailed contribution guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
@@ -830,6 +830,28 @@ def _handle_metadata_strategy(
|
|
|
830
830
|
# Then sync all other available formats
|
|
831
831
|
# Note: We need to be careful about the order to avoid conflicts
|
|
832
832
|
for fmt_name, manager in other_managers.items():
|
|
833
|
+
# Check if this format has existing metadata (for SYNC strategy)
|
|
834
|
+
has_existing = False
|
|
835
|
+
if fmt_name == "id3v1":
|
|
836
|
+
has_existing = audio_file._has_id3v1_tags()
|
|
837
|
+
elif fmt_name == "id3v2":
|
|
838
|
+
# Check if file starts with ID3
|
|
839
|
+
try:
|
|
840
|
+
from pathlib import Path
|
|
841
|
+
|
|
842
|
+
with Path(audio_file.file_path).open("rb") as f:
|
|
843
|
+
header = f.read(3)
|
|
844
|
+
has_existing = header == b"ID3"
|
|
845
|
+
except Exception:
|
|
846
|
+
has_existing = False
|
|
847
|
+
elif fmt_name == "vorbis":
|
|
848
|
+
has_existing = audio_file.file_extension == ".flac" # Vorbis is native for FLAC
|
|
849
|
+
elif fmt_name == "riff":
|
|
850
|
+
has_existing = audio_file.file_extension == ".wav" # RIFF is native for WAV
|
|
851
|
+
|
|
852
|
+
if not has_existing:
|
|
853
|
+
continue
|
|
854
|
+
|
|
833
855
|
# For non-target formats, filter out unsupported fields and warn about them
|
|
834
856
|
# This allows syncing supported fields even when some fields are not supported
|
|
835
857
|
unsupported_fields = []
|
|
@@ -6,8 +6,18 @@ capabilities and limitations.
|
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
8
|
|
|
9
|
-
from audiometa import
|
|
9
|
+
from audiometa import (
|
|
10
|
+
FlacMd5State,
|
|
11
|
+
delete_all_metadata,
|
|
12
|
+
fix_md5_checking,
|
|
13
|
+
get_bitrate,
|
|
14
|
+
get_duration_in_sec,
|
|
15
|
+
get_unified_metadata,
|
|
16
|
+
is_flac_md5_valid,
|
|
17
|
+
update_metadata,
|
|
18
|
+
)
|
|
10
19
|
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
20
|
+
from audiometa.test.tests.integration.technical_info.flac_md5.conftest import corrupt_md5, ensure_flac_has_md5
|
|
11
21
|
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
12
22
|
|
|
13
23
|
|
|
@@ -97,6 +107,54 @@ class TestFormatSpecificWorkflows:
|
|
|
97
107
|
assert bitrate > 0
|
|
98
108
|
assert duration > 0
|
|
99
109
|
|
|
110
|
+
def test_flac_md5_validity_workflow(self):
|
|
111
|
+
"""E2E test for FLAC MD5 validity checking and correction workflow."""
|
|
112
|
+
# Create a FLAC file with initial metadata
|
|
113
|
+
initial_metadata = {
|
|
114
|
+
"title": "MD5 Test FLAC Title",
|
|
115
|
+
"artist": "MD5 Test FLAC Artist",
|
|
116
|
+
"album": "MD5 Test FLAC Album",
|
|
117
|
+
}
|
|
118
|
+
with temp_file_with_metadata(initial_metadata, "flac") as test_file:
|
|
119
|
+
# Ensure the file has a valid MD5 checksum
|
|
120
|
+
ensure_flac_has_md5(test_file)
|
|
121
|
+
|
|
122
|
+
# 1. Verify initial MD5 is valid
|
|
123
|
+
initial_md5_state = is_flac_md5_valid(test_file)
|
|
124
|
+
assert initial_md5_state == FlacMd5State.VALID, "Initial FLAC file should have valid MD5"
|
|
125
|
+
|
|
126
|
+
# 2. Corrupt the MD5 checksum
|
|
127
|
+
corrupt_md5(test_file, "random")
|
|
128
|
+
|
|
129
|
+
# 3. Verify MD5 is now invalid
|
|
130
|
+
corrupted_md5_state = is_flac_md5_valid(test_file)
|
|
131
|
+
assert corrupted_md5_state == FlacMd5State.INVALID, "Corrupted MD5 should be detected as invalid"
|
|
132
|
+
|
|
133
|
+
# 4. Correct the MD5 checksum
|
|
134
|
+
corrected_file_path = fix_md5_checking(test_file)
|
|
135
|
+
|
|
136
|
+
# 5. Verify the corrected file has valid MD5
|
|
137
|
+
corrected_md5_state = is_flac_md5_valid(corrected_file_path)
|
|
138
|
+
assert corrected_md5_state == FlacMd5State.VALID, "Corrected file should have valid MD5"
|
|
139
|
+
|
|
140
|
+
# 6. Update metadata on the corrected file
|
|
141
|
+
test_metadata = {
|
|
142
|
+
UnifiedMetadataKey.TITLE: "Updated MD5 Test Title",
|
|
143
|
+
UnifiedMetadataKey.ARTISTS: ["Updated MD5 Test Artist"],
|
|
144
|
+
UnifiedMetadataKey.ALBUM: "Updated MD5 Test Album",
|
|
145
|
+
}
|
|
146
|
+
update_metadata(corrected_file_path, test_metadata)
|
|
147
|
+
|
|
148
|
+
# 7. Verify metadata was updated
|
|
149
|
+
updated_metadata = get_unified_metadata(corrected_file_path)
|
|
150
|
+
assert updated_metadata.get(UnifiedMetadataKey.TITLE) == "Updated MD5 Test Title"
|
|
151
|
+
assert updated_metadata.get(UnifiedMetadataKey.ARTISTS) == ["Updated MD5 Test Artist"]
|
|
152
|
+
assert updated_metadata.get(UnifiedMetadataKey.ALBUM) == "Updated MD5 Test Album"
|
|
153
|
+
|
|
154
|
+
# 8. Verify MD5 is still valid after metadata update
|
|
155
|
+
final_md5_state = is_flac_md5_valid(corrected_file_path)
|
|
156
|
+
assert final_md5_state == FlacMd5State.VALID, "MD5 should remain valid after metadata update"
|
|
157
|
+
|
|
100
158
|
def test_complete_metadata_workflow_wav(self):
|
|
101
159
|
# Use external script to set initial metadata
|
|
102
160
|
initial_metadata = {"title": "Initial WAV Title", "artist": "Initial WAV Artist", "album": "Initial WAV Album"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""SYNC strategy tests organized by file extension."""
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"""Tests for SYNC metadata writing strategy on FLAC files.
|
|
2
|
+
|
|
3
|
+
This module tests the SYNC strategy which writes to native format (Vorbis) and synchronizes other metadata formats
|
|
4
|
+
that are already present (ID3v1, ID3v2).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from audiometa import get_unified_metadata, update_metadata
|
|
10
|
+
from audiometa.test.helpers.id3v1.id3v1_metadata_setter import ID3v1MetadataSetter
|
|
11
|
+
from audiometa.test.helpers.id3v2.id3v2_metadata_setter import ID3v2MetadataSetter
|
|
12
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
13
|
+
from audiometa.utils.metadata_format import MetadataFormat
|
|
14
|
+
from audiometa.utils.metadata_writing_strategy import MetadataWritingStrategy
|
|
15
|
+
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.mark.integration
|
|
19
|
+
class TestFlacSyncStrategy:
|
|
20
|
+
def test_flac_no_metadata_sync(self):
|
|
21
|
+
"""Test SYNC strategy on FLAC file with no existing metadata.
|
|
22
|
+
|
|
23
|
+
SYNC should write to Vorbis (native) but NOT create ID3v1 or ID3v2.
|
|
24
|
+
"""
|
|
25
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
26
|
+
# File starts with no metadata
|
|
27
|
+
flac_metadata = {
|
|
28
|
+
UnifiedMetadataKey.TITLE: "FLAC Title",
|
|
29
|
+
UnifiedMetadataKey.ARTISTS: ["FLAC Artist"],
|
|
30
|
+
UnifiedMetadataKey.ALBUM: "FLAC Album",
|
|
31
|
+
}
|
|
32
|
+
update_metadata(test_file, flac_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
|
|
33
|
+
|
|
34
|
+
# Verify Vorbis metadata was written
|
|
35
|
+
vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
36
|
+
assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "FLAC Title"
|
|
37
|
+
assert vorbis_after.get(UnifiedMetadataKey.ARTISTS) == ["FLAC Artist"]
|
|
38
|
+
assert vorbis_after.get(UnifiedMetadataKey.ALBUM) == "FLAC Album"
|
|
39
|
+
|
|
40
|
+
# Verify ID3v1 was NOT created
|
|
41
|
+
id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
42
|
+
assert id3v1_after.get(UnifiedMetadataKey.TITLE) is None
|
|
43
|
+
|
|
44
|
+
# Verify ID3v2 was NOT created
|
|
45
|
+
id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
46
|
+
assert id3v2_after.get(UnifiedMetadataKey.TITLE) is None
|
|
47
|
+
|
|
48
|
+
# Merged metadata should show Vorbis values
|
|
49
|
+
merged = get_unified_metadata(test_file)
|
|
50
|
+
assert merged.get(UnifiedMetadataKey.TITLE) == "FLAC Title"
|
|
51
|
+
|
|
52
|
+
def test_flac_vorbis_only_sync(self):
|
|
53
|
+
"""Test SYNC strategy on FLAC file with only Vorbis metadata.
|
|
54
|
+
|
|
55
|
+
SYNC should write to Vorbis (native) but NOT create ID3v1 or ID3v2.
|
|
56
|
+
"""
|
|
57
|
+
with temp_file_with_metadata(
|
|
58
|
+
{"title": "Initial Title", "artist": "Initial Artist", "album": "Initial Album"}, "flac"
|
|
59
|
+
) as test_file:
|
|
60
|
+
# File has Vorbis metadata
|
|
61
|
+
vorbis_initial = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
62
|
+
assert vorbis_initial.get(UnifiedMetadataKey.TITLE) == "Initial Title"
|
|
63
|
+
|
|
64
|
+
# Now write Vorbis metadata with SYNC strategy
|
|
65
|
+
vorbis_metadata = {
|
|
66
|
+
UnifiedMetadataKey.TITLE: "Updated Title",
|
|
67
|
+
UnifiedMetadataKey.ARTISTS: ["Updated Artist"],
|
|
68
|
+
UnifiedMetadataKey.ALBUM: "Updated Album",
|
|
69
|
+
}
|
|
70
|
+
update_metadata(test_file, vorbis_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
|
|
71
|
+
|
|
72
|
+
# Verify Vorbis metadata was updated
|
|
73
|
+
vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
74
|
+
assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Updated Title"
|
|
75
|
+
|
|
76
|
+
# Verify ID3v1 was NOT created
|
|
77
|
+
id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
78
|
+
assert id3v1_after.get(UnifiedMetadataKey.TITLE) is None
|
|
79
|
+
|
|
80
|
+
# Verify ID3v2 was NOT created
|
|
81
|
+
id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
82
|
+
assert id3v2_after.get(UnifiedMetadataKey.TITLE) is None
|
|
83
|
+
|
|
84
|
+
# Merged metadata should show updated Vorbis values
|
|
85
|
+
merged = get_unified_metadata(test_file)
|
|
86
|
+
assert merged.get(UnifiedMetadataKey.TITLE) == "Updated Title"
|
|
87
|
+
|
|
88
|
+
def test_flac_id3v1_only_sync(self):
|
|
89
|
+
"""Test SYNC strategy on FLAC file with only ID3v1 metadata.
|
|
90
|
+
|
|
91
|
+
SYNC should write to Vorbis (native) and sync to ID3v1 (existing).
|
|
92
|
+
"""
|
|
93
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
94
|
+
# Add ID3v1 metadata using external tools
|
|
95
|
+
ID3v1MetadataSetter.set_metadata(
|
|
96
|
+
test_file, {"title": "ID3v1 Title", "artist": "ID3v1 Artist", "album": "ID3v1 Album"}
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Verify ID3v1 metadata was written
|
|
100
|
+
id3v1_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
101
|
+
assert id3v1_result.get(UnifiedMetadataKey.TITLE) == "ID3v1 Title"
|
|
102
|
+
|
|
103
|
+
# Now write Vorbis metadata with SYNC strategy
|
|
104
|
+
vorbis_metadata = {
|
|
105
|
+
UnifiedMetadataKey.TITLE: "Synced Title",
|
|
106
|
+
UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
|
|
107
|
+
UnifiedMetadataKey.ALBUM: "Synced Album",
|
|
108
|
+
}
|
|
109
|
+
update_metadata(test_file, vorbis_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
|
|
110
|
+
|
|
111
|
+
# Verify Vorbis metadata was written
|
|
112
|
+
vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
113
|
+
assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
114
|
+
|
|
115
|
+
# Verify ID3v1 metadata was synced (overwritten)
|
|
116
|
+
id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
117
|
+
assert id3v1_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
118
|
+
|
|
119
|
+
# Verify ID3v2 was NOT created
|
|
120
|
+
id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
121
|
+
assert id3v2_after.get(UnifiedMetadataKey.TITLE) is None
|
|
122
|
+
|
|
123
|
+
# Merged metadata should prefer Vorbis (higher precedence)
|
|
124
|
+
merged = get_unified_metadata(test_file)
|
|
125
|
+
assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
126
|
+
|
|
127
|
+
def test_flac_id3v2_only_sync(self):
|
|
128
|
+
"""Test SYNC strategy on FLAC file with only ID3v2 metadata.
|
|
129
|
+
|
|
130
|
+
SYNC should write to Vorbis (native) and sync to ID3v2 (existing).
|
|
131
|
+
"""
|
|
132
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
133
|
+
# Add ID3v2 metadata using external tools
|
|
134
|
+
ID3v2MetadataSetter.set_metadata(
|
|
135
|
+
test_file,
|
|
136
|
+
{"title": "ID3v2 Title", "artist": "ID3v2 Artist", "album": "ID3v2 Album"},
|
|
137
|
+
version="2.3",
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Verify ID3v2 metadata was written
|
|
141
|
+
id3v2_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
142
|
+
assert id3v2_result.get(UnifiedMetadataKey.TITLE) == "ID3v2 Title"
|
|
143
|
+
|
|
144
|
+
# Now write Vorbis metadata with SYNC strategy
|
|
145
|
+
vorbis_metadata = {
|
|
146
|
+
UnifiedMetadataKey.TITLE: "Synced Title",
|
|
147
|
+
UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
|
|
148
|
+
UnifiedMetadataKey.ALBUM: "Synced Album",
|
|
149
|
+
}
|
|
150
|
+
update_metadata(test_file, vorbis_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
|
|
151
|
+
|
|
152
|
+
# Verify Vorbis metadata was written
|
|
153
|
+
vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
154
|
+
assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
155
|
+
|
|
156
|
+
# Verify ID3v2 metadata was synced (overwritten)
|
|
157
|
+
id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
158
|
+
assert id3v2_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
159
|
+
|
|
160
|
+
# Verify ID3v1 was NOT created
|
|
161
|
+
id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
162
|
+
assert id3v1_after.get(UnifiedMetadataKey.TITLE) is None
|
|
163
|
+
|
|
164
|
+
# Merged metadata should prefer Vorbis (higher precedence)
|
|
165
|
+
merged = get_unified_metadata(test_file)
|
|
166
|
+
assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
167
|
+
|
|
168
|
+
def test_flac_vorbis_plus_id3v1_sync(self):
|
|
169
|
+
"""Test SYNC strategy on FLAC file with Vorbis and ID3v1 metadata.
|
|
170
|
+
|
|
171
|
+
SYNC should write to Vorbis (native) and sync to ID3v1 (existing).
|
|
172
|
+
"""
|
|
173
|
+
with temp_file_with_metadata(
|
|
174
|
+
{"title": "Vorbis Title", "artist": "Vorbis Artist", "album": "Vorbis Album"}, "flac"
|
|
175
|
+
) as test_file:
|
|
176
|
+
# Add ID3v1 metadata using external tools
|
|
177
|
+
ID3v1MetadataSetter.set_metadata(
|
|
178
|
+
test_file, {"title": "ID3v1 Title", "artist": "ID3v1 Artist", "album": "ID3v1 Album"}
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
# Verify both formats have metadata
|
|
182
|
+
vorbis_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
183
|
+
assert vorbis_result.get(UnifiedMetadataKey.TITLE) == "Vorbis Title"
|
|
184
|
+
id3v1_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
185
|
+
assert id3v1_result.get(UnifiedMetadataKey.TITLE) == "ID3v1 Title"
|
|
186
|
+
|
|
187
|
+
# Now write Vorbis metadata with SYNC strategy
|
|
188
|
+
sync_metadata = {
|
|
189
|
+
UnifiedMetadataKey.TITLE: "Synced Title",
|
|
190
|
+
UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
|
|
191
|
+
UnifiedMetadataKey.ALBUM: "Synced Album",
|
|
192
|
+
}
|
|
193
|
+
update_metadata(test_file, sync_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
|
|
194
|
+
|
|
195
|
+
# Verify Vorbis metadata was updated
|
|
196
|
+
vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
197
|
+
assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
198
|
+
|
|
199
|
+
# Verify ID3v1 metadata was synced
|
|
200
|
+
id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
201
|
+
assert id3v1_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
202
|
+
|
|
203
|
+
# Verify ID3v2 was NOT created
|
|
204
|
+
id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
205
|
+
assert id3v2_after.get(UnifiedMetadataKey.TITLE) is None
|
|
206
|
+
|
|
207
|
+
# Merged metadata should prefer Vorbis
|
|
208
|
+
merged = get_unified_metadata(test_file)
|
|
209
|
+
assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
210
|
+
|
|
211
|
+
def test_flac_vorbis_plus_id3v2_sync(self):
|
|
212
|
+
"""Test SYNC strategy on FLAC file with Vorbis and ID3v2 metadata.
|
|
213
|
+
|
|
214
|
+
SYNC should write to Vorbis (native) and sync to ID3v2 (existing).
|
|
215
|
+
"""
|
|
216
|
+
with temp_file_with_metadata(
|
|
217
|
+
{"title": "Vorbis Title", "artist": "Vorbis Artist", "album": "Vorbis Album"}, "flac"
|
|
218
|
+
) as test_file:
|
|
219
|
+
# Add ID3v2 metadata using external tools
|
|
220
|
+
ID3v2MetadataSetter.set_metadata(
|
|
221
|
+
test_file,
|
|
222
|
+
{"title": "ID3v2 Title", "artist": "ID3v2 Artist", "album": "ID3v2 Album"},
|
|
223
|
+
version="2.3",
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Verify both formats have metadata
|
|
227
|
+
vorbis_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
228
|
+
assert vorbis_result.get(UnifiedMetadataKey.TITLE) == "Vorbis Title"
|
|
229
|
+
id3v2_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
230
|
+
assert id3v2_result.get(UnifiedMetadataKey.TITLE) == "ID3v2 Title"
|
|
231
|
+
|
|
232
|
+
# Now write Vorbis metadata with SYNC strategy
|
|
233
|
+
sync_metadata = {
|
|
234
|
+
UnifiedMetadataKey.TITLE: "Synced Title",
|
|
235
|
+
UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
|
|
236
|
+
UnifiedMetadataKey.ALBUM: "Synced Album",
|
|
237
|
+
}
|
|
238
|
+
update_metadata(test_file, sync_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
|
|
239
|
+
|
|
240
|
+
# Verify Vorbis metadata was updated
|
|
241
|
+
vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
242
|
+
assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
243
|
+
|
|
244
|
+
# Verify ID3v2 metadata was synced
|
|
245
|
+
id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
246
|
+
assert id3v2_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
247
|
+
|
|
248
|
+
# Verify ID3v1 was NOT created
|
|
249
|
+
id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
250
|
+
assert id3v1_after.get(UnifiedMetadataKey.TITLE) is None
|
|
251
|
+
|
|
252
|
+
# Merged metadata should prefer Vorbis
|
|
253
|
+
merged = get_unified_metadata(test_file)
|
|
254
|
+
assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
255
|
+
|
|
256
|
+
def test_flac_all_formats_sync(self):
|
|
257
|
+
"""Test SYNC strategy on FLAC file with Vorbis, ID3v1, and ID3v2 metadata.
|
|
258
|
+
|
|
259
|
+
SYNC should write to Vorbis (native) and sync to ID3v1 and ID3v2 (existing).
|
|
260
|
+
"""
|
|
261
|
+
with temp_file_with_metadata(
|
|
262
|
+
{"title": "Vorbis Title", "artist": "Vorbis Artist", "album": "Vorbis Album"}, "flac"
|
|
263
|
+
) as test_file:
|
|
264
|
+
# Add ID3v1 metadata using external tools
|
|
265
|
+
ID3v1MetadataSetter.set_metadata(
|
|
266
|
+
test_file, {"title": "ID3v1 Title", "artist": "ID3v1 Artist", "album": "ID3v1 Album"}
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
# Add ID3v2 metadata using external tools
|
|
270
|
+
ID3v2MetadataSetter.set_metadata(
|
|
271
|
+
test_file,
|
|
272
|
+
{"title": "ID3v2 Title", "artist": "ID3v2 Artist", "album": "ID3v2 Album"},
|
|
273
|
+
version="2.3",
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
# Verify all formats have metadata
|
|
277
|
+
vorbis_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
278
|
+
assert vorbis_result.get(UnifiedMetadataKey.TITLE) == "Vorbis Title"
|
|
279
|
+
id3v1_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
280
|
+
assert id3v1_result.get(UnifiedMetadataKey.TITLE) == "ID3v1 Title"
|
|
281
|
+
id3v2_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
282
|
+
assert id3v2_result.get(UnifiedMetadataKey.TITLE) == "ID3v2 Title"
|
|
283
|
+
|
|
284
|
+
# Now write Vorbis metadata with SYNC strategy
|
|
285
|
+
sync_metadata = {
|
|
286
|
+
UnifiedMetadataKey.TITLE: "Synced Title",
|
|
287
|
+
UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
|
|
288
|
+
UnifiedMetadataKey.ALBUM: "Synced Album",
|
|
289
|
+
}
|
|
290
|
+
update_metadata(test_file, sync_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
|
|
291
|
+
|
|
292
|
+
# Verify Vorbis metadata was updated
|
|
293
|
+
vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
|
|
294
|
+
assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
295
|
+
|
|
296
|
+
# Verify ID3v1 metadata was synced
|
|
297
|
+
id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
|
|
298
|
+
assert id3v1_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
299
|
+
|
|
300
|
+
# Verify ID3v2 metadata was synced
|
|
301
|
+
id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
|
|
302
|
+
assert id3v2_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|
|
303
|
+
|
|
304
|
+
# Merged metadata should prefer Vorbis
|
|
305
|
+
merged = get_unified_metadata(test_file)
|
|
306
|
+
assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"
|